package com.baofu.paycore.service.facade.enums;

import com.system.commons.exception.ErrorCode;
import lombok.Getter;

/**
 * User: LZQ
 * <p>
 * 注意：错误码定义规则，错误码长度不能超过32位
 * </p>
 * 统一支付业务层错误码
 */
@Getter
public enum PayCoreErrorCode implements ErrorCode {

    /**
     * 执行数据库操作发生异常,具体查看数据库返回的异常信息
     */
    DATA_BASE_ERROR("DATA_BASE_ERROR", "数据库操作异常"),

    /**
     * DATABASE_INSERT_FAILED:数据插入失败
     */
    INSERT_DATA_NOT_NOE("INSERT_DATA_NOT_NOE", "数据库插入异常, 新增条数不为一"),

    /**
     * 更新数不为一条
     */
    UPDATE_DATA_NOT_ONE("UPDATE_DATA_NOT_ONE", "数据库插入异常, 更新数不为一条"),

    /**
     * DATABASE_FORUPDATE_EXCEPTION:获取行锁异常
     */
    DATABASE_FOR_UPDATE_EXCEPTION("DATABASE_FOR_UPDATE_EXCEPTION", "获取行锁异常"),

    /**
     * 调用异常，需异步重试，响应前端受理结果
     */
    ACCEPT_RESPONSE("ACCEPT_RESPONSE", "调用异常，需异步重试，响应前端受理结果"),

    /**
     * 参数校验不通过 ，未明确具体参数的情况使用该枚举
     */
    PARAMETER_VALID_NOT_PASS("PARAMETER_VALID_NOT_PASS", "参数校验不通过"),

    /**
     * 参数对象内部属性校验不通过 ，不同于参数对象本身校验
     */
    PARAMETER_FIELD_VALID_NOT_PASS("PARAMETER_FIELD_VALID_NOT_PASS", " 参数对象内部属性校验不通过"),

    /**
     * 参数为空（含null）是非法的
     */
    BLANK_IS_ILLEGAL_PARAM("BLANK_IS_ILLEGAL_PARAM", "参数为空（含null）是非法的"),

    /**
     * 参数为null（不含空字符串）是非法的
     */
    NULL_IS_ILLEGAL_PARAM("NULL_IS_ILLEGAL_PARAM", "参数为null是非法的"),

    /**
     * 参数集合为空（含null）是非法的
     */
    EMPTY_COLLECTION_ILLEGAL_PARAM("EMPTY_COLLECTION_ILLEGAL_PARAM", "参数集合为空（含null）是非法的"),

    /**
     * 每页显示数量超过限定值
     */
    PAGE_SIZE_OUT_OF_LIMIT("PAGE_SIZE_OUT_OF_LIMIT", "每页显示数量超过限定值"),

    /**
     * 根据查询参数没有找到匹配的记录
     */
    EMPTY_QUERY_RESULT("EMPTY_QUERY_RESULT", "查询结果为空"),

    /**
     * 远程服务调用返回异常（可能导致交易重试）
     */
    REMOTE_SERVICE_INVOKE_EXCEPTION("REMOTE_SERVICE_INVOKE_EXCEPTION", "远程服务调用返回异常"),

    /**
     * 调用服务超时
     */
    REMOTE_SERVICE_TIME_OUT("REMOTE_SERVICE_TIME_OUT", "调用服务超时"),

    /**
     * dispatch 重试异常
     */
    DISPATCH_RETRY_EXCEPTION("DISPATCH_RETRY_EXCEPTION", "dispatch 重试异常"),

    DISPATCH_TIME_OUT_HANDLE_ERROR("DISPATCH_TIME_OUT_HANDLE_ERROR", "超时dispatch处理失败"),

    /**
     * 远程服务调用返回失败
     */
    REMOTE_SERVICE_INVOKE_FAIL("REMOTE_SERVICE_INVOKE_FAIL", "远程服务调用返回失败"),

    /**
     * 这种情况一般是捕获了没有单独进行catch处理的异常然后设定的错误码
     */
    UNEXPECTED_ERROR("UNEXPECTED_ERROR", "非预期的系统错误"),

    /**
     * 不支持的取值
     */
    VALUE_NOT_SUPPORT("VALUE_NOT_SUPPORT", "不支持的取值"),

    /**
     * 唯一性约束错误
     */
    UNIQUE_ERROR("UNIQUE_ERROR", "唯一性约束错误"),

    /**
     * 未获得支付锁权限
     */
    NOT_GET_PAY_LOCK("NOT_GET_PAY_LOCK", "未获得支付锁权限"),

    /**
     * 支付订单已支付完成，不能重复支付
     */
    PAY_IS_SUCCEED("PAY_IS_SUCCEED", "支付订单已支付成功，不能重复支付"),

    /**
     * 金额不一致
     */
    AMT_IS_NOT_IN_CONFORMITY("AMT_IS_NOT_PASS", "金额不一致"),

    /**
     * 手续费金额不能大于等于付款金额
     */
    FEE_AMT_NOT_MORE_PAY_AMT("FEE_AMT_NOT_MORE_PAY_AMT", "手续费金额不能大于等于付款金额"),

    /**
     * 原交易不存在
     */
    OLD_ORDER_IS_NOT_EXISTED("OLD_ORDER_IS_NOT_EXISTED", "原交易不存在"),

    /**
     * 交易不存在
     */
    ORDER_IS_NOT_EXISTED("ORDER_IS_NOT_EXISTED", "交易不存在"),

    /**
     * 交易明细不存在
     */
    SUB_ORDER_IS_NOT_EXISTED("SUB_ORDER_IS_NOT_EXISTED", "交易明细不存在"),

    /**
     * 重复撤销、冲正、退款
     */
    RE_CANCEL_OR_EC("RE_CANCEL_OR_EC", "重复处理"),

    /**
     * 暂不支持此业务
     */
    NOT_IN_SERVICE("NOT_IN_SERVICE", "暂不支持此业务"),

    /**
     * 请求银行接口异常
     */
    BANK_REQUEST_ERROR("BANK_REQUEST_ERROR", "请求银行接口异常"),

    /**
     * 冲正交易跨天
     */
    REVERSE_ACROSS_DATE("REVERSE_ACROSS_DATE", "冲正交易跨天"),

    /**
     * 理财申购、赎回异常
     */
    FINANCIAL_ERROR("FINANCIAL_ERROR", "理财申购、赎回异常"),

    /**
     * 创建银行请求参数错误
     */
    CREATE_BANK_PARAM_ERROR("CREATE_BANK_PARAM_ERROR", "创建银行请求参数错误"),

    /**
     * 补单异常
     */
    ADVANCE_ORDER_ERROR("ADVANCE_ORDER_ERROR", "补单异常"),
    /**
     * 获取会计日异常
     */
    ACCOUNT_DAT_ERROR("ACCOUNT_DAT_ERROR", "获取会计日异常"),
    /**
     * 超出限制数
     */
    EXCEED_LIMIT_COUNT("EXCEED_LIMIT_COUNT", "超出限制数"),

    REQUEST_ACCOUNT_ERROR("REQUEST_ACCOUNT_ERROR","请求账务失败"),

    EVENT_NO_NOT_EXIST("EVENT_NO_NOT_EXIST", "会计事件号不存在"),

    BIZ_FEE_ACCOUNT_NOT_NULL("BIZ_FEE_ACCOUNT_NOT_NULL", "业务手续费账户不能为空"),

    RECHARGE_FUND_SORT_ERROR("RECHARGE_FUND_SORT_ERROR", "充值资金单顺序有误"),

    COMMAND_HANDLE_ERROR("COMMAND_HANDLE_ERROR", "指令处理有误"),

    RECHARGE_ORDER_IS_SUCCESS("RECHARGE_ORDER_IS_SUCCESS", "充值主单已经成功"),

    TRANSFER_ORDER_ERROR("TRANSFER_ORDER_ERROR", "转账单有误"),

    PAY_TYPE_NOT_EXISTED("PAY_TYPE_NOT_EXISTED", "支付类型不存在"),

    CLEAR_BANK_STATUS_NOT_FAIL("CLEAR_BANK_STATUS_NOT_FAIL", "清分银行状态不为失败"),

    CLEAR_ACC_STATUS_NOT_SUC("CLEAR_ACC_STATUS_NOT_SUC", "清分账务状态不为成功"),

    CLEAR_ACC_STATUS_NOT_INIT("CLEAR_ACC_STATUS_NOT_INIT", "清分账务状态不为初始"),

    ORDER_STATUS_NOT_INIT("ORDER_STATUS_NOT_INIT", "订单状态不为初始"),

    CLEAR_ORDER_NOT_EXIST("CLEAR_ORDER_NOT_EXIST", "清分订单不存在"),

    CLEAR_STATUS_NOT_SUCCESS("CLEAR_STATUS_NOT_SUCCESS", "清分单状态未成功"),

    FREEZE_ORDER_NO_FREEZECODE("FREEZE_ORDER_NO_FREEZECODE","冻结单无冻结码"),


    /**
     * 抢锁失败
     */
    REDIS_LOCK_ERROR("REDIS_LOCK_ERROR", "抢锁失败"),

    /**
     * 订单已存在
     */
    ORDER_EXITS("ORDER_EXITS", "订单已存在"),

    PRE_AUTH_ORDER_NO_EXIST("PRE_AUTH_ORDER_NO_EXIST", "预授权订单不存在"),

    PRE_AUTH_ORDER_NO_SUC("PRE_AUTH_ORDER_NO_SUC", "预授权单状态未成功"),

    FREEZE_ORDER_NO_EXIST("FREEZE_ORDER_NO_EXIST", "冻结订单不存在"),

    FREEZE_ORDER_NO_SUC("FREEZE_ORDER_NO_SUC", "冻结单状态未成功"),

    OVERRUN_REFUND_AMOUNT("OVERRUN_REFUND_AMOUNT", "超出退款金额"),

    OVERRUN_CANCEL_AMOUNT("OVERRUN_CANCEL_AMOUNT", "预授权撤销金额大于可撤销金额"),

    OVERRUN_CONFIRM_AMOUNT("OVERRUN_CONFIRM_AMOUNT", "预授权完成金额大于可预授权金额"),

    OVERRUN_UNFREEZE_AMOUNT("OVERRUN_UNFREEZE_AMOUNT", "解冻金额大于可解冻金额"),

    /**
     * 退款原单不存在
     */
    ORIG_ORDER_NOT_EXIST("ORIG_ORDER_NOT_EXIST", "原单不存在"),

    ORIG_PAY_NO_NOT_EXIST("ORIG_PAY_NO_NOT_EXIST", "原支付单号不存在"),

    ACCOUNT_STATUS_ERROR("ACCOUNT_STATUS_ERROR", "账务状态有误"),

    /**
     * 退款策略信息为空
     */
    REFUND_STRATEGY_IS_NULL("REFUND_STRATEGY_IS_NULL","退款策略信息为空"),

    /**
     * 退款优先级已存在
     */
    REFUND_PRIORITY_IS_EXIST("REFUND_PRIORITY_IS_EXIST", "退款优先级已存在"),

    /**
     * 退款优先级配置不存在
     */
    REFUND_PRIORITY_IS_NULL("REFUND_PRIORITY_IS_NULL", "退款优先级配置不存在"),

    /**
     * 退款模式为空
     */
    REFUND_STRATEGY_MODE_IS_NULL("REFUND_STRATEGY_MODE_IS_NULL", "退款模式为空"),

    /**
     * 退款模式已存在
     */
    REFUND_PRIORITY_MODE_IS_EXIST("REFUND_PRIORITY_MODE_IS_EXIST", "退款模式已存在"),

    /**
     * 产品退款策略信息不存在
     */
    REFUND_PRODUCT_PRIORITY_IS_NULL("REFUND_PRODUCT_PRIORITY_IS_NULL", "产品退款策略信息不存在"),

    /**
     * 产品退款策略信息已存在
     */
    REFUND_PRODUCT_PRIORITY_IS_EXIST("REFUND_PRODUCT_PRIORITY_IS_NULL", "产品退款策略信息已存在"),

    /**
     * 退款策略配置错误
     */
    REFUND_STRATEGY_CONFIG_ERROR("REFUND_STRATEGY_CONFIG_ERROR", "退款策略配置错误"),

    /**
     * 退款资金单明细构建失败
     */
    REFUND_ORDER_DETAIL_BUILD_ERROR("REFUND_ORDER_DETAIL_BUILD_ERROR", "退款资金单明细构建失败"),

    /**
     * 退款原单解析失败
     */
    ORIG_ORDER_DETAIL_ANALYSIS_ERROR("ORIG_ORDER_DETAIL_ANALYSIS_ERROR", "退款原单解析失败"),

    /**
     * 回调参数校验不通过
     */
    CALLBACK_PARAM_VALID_NOT_PASS("CALLBACK_PARAM_VALID_NOT_PASS", "回调参数校验不通过"),

    /**
     * 撤销时描述不能为空
     */
    DESCRIPTION_CAN_NOT_BE_NULL("DESCRIPTION_CAN_NOT_BE_NULL","撤销时描述不能为空"),

    /**
     * 余额不足
     */
    BAL_CANNOT_NEGATIVE("BAL_CANNOT_NEGATIVE", "余额不足"),

    /**
     * 重复回调
     */
    CALLBACK_REPEAT_EXCEPTION("CALLBACK_REPEAT_EXCEPTION", "重复回调"),

    ACC_UNFREEZE_EXCEPTION("ACC_UNFREEZE_EXCEPTION", "账务解冻失败"),

    REQUEST_CREATED_AT_NOT_NULL("REQUEST_CREATED_AT_NOT_NULL", "请求创建时间不能为空"),

    PRODUCT_CHANNEL_IS_NULL("PRODUCT_CHANNEL_IS_NULL", "产品渠道不能为空"),

    REQUEST_START_DATE("REQUEST_START_DATE", "请求开始时间不能为空"),

    REQUEST_END_DATE("REQUEST_END_DATE", "请求结束时间不能为空"),

    /**
     * diff
     */
    ORDER_START_NOT_SUCCESS("ORDER_START_NOT_SUCCESS","前提订单状态未成功"),

    ORDER_STATUS_SUCCESSED("ORDER_STATUS_SUCCESSED","订单状态已成功")
    ;

    /**
     * 错误编码
     */
    private String errorCode;

    /**
     * 错误描述
     */
    private String errorDesc;

    /**
     * 构造函数
     *
     * @param code      错误码
     * @param desc      错误描述
     */
    PayCoreErrorCode(String code, String desc) {
        this.errorCode = code;
        this.errorDesc = desc;
    }

    /**
     * 通过枚举<code>code</code>获得枚举
     *
     * @param code 如果为null，返回null
     * @return 不匹配返回<code>null</code>
     */
    public static PayCoreErrorCode getByCode(String code) {
        if (code != null) {
            for (PayCoreErrorCode result : values()) {
                if (result.getErrorCode().equals(code)) {
                    return result;
                }
            }
        }
        return UNEXPECTED_ERROR;
    }

    /**
     * 设置错误描述信息
     *
     * @param errorMsg 错误信息
     */
    @Override
    public void setErrorDesc(String errorMsg) { }
}
